package com.fwj.authorization.security;

import lombok.Getter;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.User;

import java.util.Collection;
import java.util.List;

/**
 * LoginUser
 *
 * @author 樊温军
 * @date 2025/3/18 上午10:32
 */
@Getter
public class LoginUser extends User {

    /**
     * 用户ID
     */
    private Long id;
    /**
     * 真实姓名
     */
    private String realname;
    /**
     * 组织ID
     */
    private Long orgId;
    /**
     * 用户类型
     */
    private String type;
    /**
     * 租户ID
     */
    private String tenantId;
    /**
     * 角色权限码 roleCode[/user/page]
     */
    private List<String> rolePrem;

    /**
     * Construct the <code>User</code> with the details required by
     * {@link DaoAuthenticationProvider}.
     *
     * @param id                    用户ID
     * @param orgId                 组织ID
     * @param tenantId              租户ID
     * @param username              the username presented to the
     *                              <code>DaoAuthenticationProvider</code>
     * @param password              the password that should be presented to the
     *                              <code>DaoAuthenticationProvider</code>
     * @param enabled               set to <code>true</code> if the user is enabled
     * @param accountNonExpired     set to <code>true</code> if the account has not expired
     * @param credentialsNonExpired set to <code>true</code> if the credentials have not
     *                              expired
     * @param accountNonLocked      set to <code>true</code> if the account is not locked
     * @param authorities           the authorities that should be granted to the caller if they
     *                              presented the correct username and password and the user is enabled. Not null.
     * @throws IllegalArgumentException if a <code>null</code> value was passed either as
     *                                  a parameter or as an element in the <code>GrantedAuthority</code> collection
     */
    public LoginUser(Long id, Long orgId, String tenantId, String username, String realname, String password,
                     boolean enabled,
                     boolean accountNonExpired,
                     boolean credentialsNonExpired,
                     boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities,
                     String type, List<String> rolePrem) {
        super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
        this.id = id;
        this.realname = realname;
        this.orgId = orgId;
        this.type = type;
        this.tenantId = tenantId;
        this.rolePrem = rolePrem;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}
